package com.gp.base;

import java.io.Serializable;
import java.util.List;

import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import com.gp.base.except.DaoException;
import com.gp.base.util.ECPage;
import com.gp.base.util.StrUtil;

public class BaseDao extends SqlMapClientDaoSupport{

	/**
	 * 
	 * <li>方法名：get
	 * <li>@param id
	 * <li>@param cls
	 * <li>@return
	 * <li>返回类型：Object
	 * <li>说明：通过id获得对象
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-03-04
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	public Object get(Serializable id, Class cls) throws DaoException {
		String sqlName = cls.getSimpleName() + ".get";
		return super.getSqlMapClientTemplate().queryForObject(sqlName, id);
	}
	
	/**
	 * 
	 * <li>方法名：get
	 * <li>@param id
	 * <li>@param statementName 
	 * <li>@return
	 * <li>返回类型：Object
	 * <li>说明：通过id获得对象
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-03-04
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	public Object get(Serializable id, String statementName) throws DaoException {
		return super.getSqlMapClientTemplate().queryForObject(statementName, id);
	}
	
	
	/**
	 * 
	 * <li>方法名：insert
	 * <li>@param entity
	 * <li>@param statementName
	 * <li>@return
	 * <li>@throws DaoException
	 * <li>返回类型：Object
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-3-4
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	public Object insert(Object entity, String... statementName) throws DaoException {
		this.setEntityIdValue(entity, StrUtil.getUUID());		
		String statement = this.getStatementName(entity, "insert", statementName);
		Object obj = null;
		try{
			obj = super.getSqlMapClientTemplate().insert(statement, entity);
		}catch(Exception e){
			this.setEntityIdValue(entity, null);
		}
		
		return obj;
	}
	
	/**
	 * 
	 * <li>方法名：update
	 * <li>@param entity
	 * <li>@param statementName
	 * <li>@return
	 * <li>@throws DaoException
	 * <li>返回类型：Object
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-3-4
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	public int update(Object entity, String... statementName) throws DaoException {
		
		String statement = this.getStatementName(entity, "update", statementName);
		
		return super.getSqlMapClientTemplate().update(statement, entity);
	}
	
	/**
	 * 
	 * <li>方法名：delete
	 * <li>@param cls
	 * <li>@param ids
	 * <li>@return
	 * <li>@throws DaoException
	 * <li>返回类型：Object
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-3-4
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	public int delete( Class cls,Serializable... ids) throws DaoException {
		String statement = cls.getSimpleName() + ".delete";
		if(ids == null || ids.length == 0){
			throw  new DaoException("请指定要删除的数据！");
		}
		else if(ids.length == 1){
			return super.getSqlMapClientTemplate().delete(statement, ids);
		}
		else{
			int row = 0;
			for (Serializable id : ids) {
				row = row + super.getSqlMapClientTemplate().delete(statement, id);
			}
			return row;
		}
	}

	/**
	 * 
	 * <li>方法名：delete
	 * <li>@param statement
	 * <li>@param ids
	 * <li>@return
	 * <li>@throws DaoException
	 * <li>返回类型：Object
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-3-4
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	public int delete( String statement,Serializable... ids) throws DaoException {
		if(ids == null || ids.length == 0){
			throw  new DaoException("请指定要删除的数据！");
		}
		else if(ids.length == 1){
			return super.getSqlMapClientTemplate().delete(statement, ids);
		}
		else{
			int row = 0;
			for (Serializable id : ids) {
				row = row + super.getSqlMapClientTemplate().delete(statement, id);
			}
			return row;
		}
	}
	/**
	 * 
	 * <li>方法名：find
	 * <li>@param entitySearch
	 * <li>@param statementName 动态参数，不用默认执行find语句
	 * <li>@return
	 * <li>@throws DaoException
	 * <li>返回类型：List
	 * <li>说明：不分页查询
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-03-04
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	public List find(Object entitySearch, String... statementName) throws DaoException{
		
		String statement = this.getStatementName(entitySearch, "find", statementName);
				
		return super.getSqlMapClientTemplate().queryForList(statement, entitySearch);
	}
	
	/**
	 * 
	 * <li>方法名：findOne
	 * <li>@param entitySearch
	 * <li>@param statementName
	 * <li>@return
	 * <li>@throws DaoException
	 * <li>返回类型：Object
	 * <li>说明：查找一个
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-3-12
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	public Object findOne(Object entitySearch, String... statementName) throws DaoException{
		
		String statement = this.getStatementName(entitySearch, "find", statementName);
		
		List list = super.getSqlMapClientTemplate().queryForList(statement, entitySearch);
		if(list == null || list.size() == 0){
			return null;
		}
		else{
			return list.get(0);
		}
	}
	
	
		
	/**
	 * 
	 * <li>方法名：findPage
	 * <li>@param entitySearch
	 * <li>@param page
	 * <li>@param statementName 动态参数，不用默认执行findPage语句
	 * <li>@return
	 * <li>@throws DaoException
	 * <li>返回类型：List
	 * <li>说明：分页查询
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-03-04
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	public List findPage(Object entitySearch, ECPage page, String... statementName) throws DaoException{
		
		String statement = this.getStatementName(entitySearch, "findPage", statementName);
		
		BaseDomain entityDomain = (BaseDomain)entitySearch;
		entityDomain.setStartRow(page.getStartRow()-1);
		
		if(StrUtil.isNotEmpty(page.getOrderString())){
			entityDomain.setOrderBy(page.getOrderString());
		}
		
		return super.getSqlMapClientTemplate().queryForList(statement, entitySearch);
	}
	
		
	/**
	 * 
	 * <li>方法名：getCount
	 * <li>@param entitySearch
	 * <li>@param statementName 动态参数，不用默认执行getCount语句
	 * <li>@return
	 * <li>返回类型：Integer
	 * <li>说明：查询记录数量
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-03-04
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	public Integer getCount(Object entitySearch, String... statementName){
		
		String statement = this.getStatementName(entitySearch, "getCount", statementName);
		
		return (Integer)super.getSqlMapClientTemplate().queryForObject(statement, entitySearch);
	}
	
	/**
	 * 
	 * <li>方法名：getStatementName
	 * <li>@param entity
	 * <li>@param defautStatement
	 * <li>@param statementName
	 * <li>@return
	 * <li>返回类型：String
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2011-3-4
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	private String getStatementName(Object entity, String defautStatement, String... statementName){
		String statement = null;
		if(statementName != null && statementName.length > 0){
			statement = statementName[0];
		}
		else{
			statement = entity.getClass().getSimpleName() + "." + defautStatement;
		}
		return statement;
	}
	
	private void setEntityIdValue(Object entity, Object value){
		try{
			BeanWrapper bw = new BeanWrapperImpl(entity);
			bw.setPropertyValue("id",value);
		}catch(Exception e){}
	}
}
